#!/bin/bash

# Nombre: ntfs.inc.sh
# Autor: Luis Guillen
# Fecha: 2008-11-21
# Descipcion:
#   Esta libreria proporciona las funciones necesarias para el montaje, chequeo y redimensonamiento
#   de recursos ntfs
#   Requiere de: base.inc.sh

# Al incluir crea el directorio raiz de cifs
ROOTNTFS=/mnt/windows

# Poner opciones para el montaje ntfs-3g si hacen falta en esta constante
OPTMNTNTFS=""

mkdir -p $ROOTNTFS

# Sólo funciona con kernels superiores 2.6.20!! driver ide major 8 también!
# Recibe por parametros el dispositivo a montar
# Salida 0 si esta montado
#        1 si NO lo esta
ntfsExisteParticion()
{
	if [ $# -ne 1 ]; then
		echo "ntfsExisteParticion() ERROR: Debe de pasar el dispositivo!!"
		exit 1
	fi
	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`

	# Comprueba si el dispositivo está en /proc/partitions 
	numero=`cat /proc/partitions | grep -i "$nomdis" | wc -l`
	if [ $numero -eq 0 ]; then
		escribeLog "No existe la partición en /proc/partitions"
                return 1
        fi

	# Comprueba si el dispositivo el número major del dispositivo en /proc/partitions
	# es un major 8
	numeromajor=`cat /proc/partitions | grep -i "$nomdis" | tr -s " " | cut -f2 -d" "`
	if [ $numeromajor -ne 8 ]; then
		escribeLog "ERROR: el número major no es el que se espera"
                return 1
        fi

	# Comprueba si la partición es HPFS/NTFS (tipo 7)
	tipoparticion=`fdisk -l | grep "^$dispositivo" | tr "*" " "| tr -s " " | cut -f5 -d" "`
	if [ $tipoparticion -ne 7 ]; then
		escribeLog "ERROR: el tipo de partición no es ntfs (tipo 7)"
                return 1
	fi

	return 0
}

# Recibe por parametros el dispositivo a montar
# Salida 0 si esta montado
#        1 si NO lo esta
ntfsEstaMontado()
{
	if [ $# -ne 1 ]; then
		echo "ntfsEstaMontado() ERROR: Debe de pasar el dispositivo!!"
		exit 1
	fi
	dispositivo=$1

	numero=`cat /etc/mtab | grep -i "^$dispositivo " | wc -l`
	if [ $numero -eq 0 ]; then
                return 1
	else
		return 0
        fi
}


# Crea en /mnt/windows/dispositivo el montaje
ntfsMontaParticion()
{
	if [ $# -ne 1 ]; then
		echo "ntfsMontaParticion() ERROR: Debe de pasar el dispositivo!!"
		exit 1
	fi

	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -eq 0 ]; then
		escribeLog "Error, el recurso ya se encuentra montado"
		return 1
	fi

	ntfsExisteParticion $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "Error, la partición dque se pretende montar no es válida"
		return 1
	fi

	punto_montaje=${ROOTNTFS}/${nomdis}

	mkdir -p $punto_montaje
	if [ $? -ne 0 ]; then
		escribeLog "Error durante la creación del punto de montaje!"
		return 1
	fi

	opciones=$OPTMNTNTFS
	if [ ! -z $opciones ]; then
		mount.ntfs-3g $dispositivo $punto_montaje -o $opciones
	else
		mount.ntfs-3g $dispositivo $punto_montaje
	fi

	if [ $? -ne 0 ]; then
		escribeLog "Error durante el montaje!"
		return 1
	fi

	escribeLog "La partición se ha montado en $punto_montaje"
	return 0
}

ntfsDesmontaParticion()
{
	if [ $# -ne 1 ]; then
		echo "ntfsDesmontaParticion() ERROR: Debe de pasar la partición!!"
		exit 1
	fi

	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "Error, el recurso NO se encuentra montado"
		return 1
	fi

	punto_montaje=${ROOTNTFS}/${nomdis}

	umount $punto_montaje
	if [ $? -ne 0 ]; then
		escribeLog "Error durante el desmontaje!"
		return 1
	fi

	escribeLog "El recurso se ha desmontado de $punto_montaje"
	return 0
}

# Recibe la partición
redimensionaParticion()
{
	if [ $# -ne 1 ]; then
		echo "redimensionaParticion() ERROR: Debe de pasar el dispositivo!!"
		exit 1
	fi

	ntfsExisteParticion $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "Error, la partición destino no es válida"
		return 1
	fi

	ntfsresize -f $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se ha podido redimensionar la partición correctamente"
		return 1
	fi

	escribeLog "La partición se dimensionó correctamente"

	return 0

}

existenParticionesNtfs()
{
	numero=`fdisk -l | grep "^/dev/" | tr "*" " " | tr -s " " | grep ".* .* .* .* 7 .*" | wc -l`

	if [ $numero -eq 0 ]; then
		escribeLog "No existen particiones tipo ntfs"
		return 1
	else
		escribeLog "Existen particiones tipo ntfs"
		return 0
	fi
}

listaParticionesNtfs()
{
	fdisk -l | grep "^/dev/" | tr "*" " " | tr -s " " | grep ".* .* .* .* 7 .*" > /tmp/ntfslist.tmp
	while read linea; do 	
		dispositivo=`echo $linea | cut -d" " -f1`
		#descripcion=`echo $linea | tr " " "_"`
		descripcion=`echo $linea`
		echo "${dispositivo} \"${descripcion}\""
	done < /tmp/ntfslist.tmp
 
	rm /tmp/ntfslist.tmp
}

# Recibe la partición
reparaSectorInicioParticion()
{
	if [ $# -ne 1 ]; then
		echo "reparaSectorInicioParticion() ERROR: Debe de pasar la partición!!"
		exit 1
	fi

	particion=$1

#	sector_inicio=`fdisk -ul | grep "^${particion}" | tr "*" " " | tr -s " " | grep ".* .* .* .* 7 .*" | cut -f2 -d" "`
	sector_inicio=`fdisk -l | grep "^${particion}" | tr "*" " " | tr -s " " | grep ".* .* .* .* 7 .*" | cut -f2 -d" "`
	if [ -z $sector_inicio ]; then
		escribeLog "No se pudo obtener el sector de inicio ntfs. La particion es NTFS?"
		return 1
	fi

	echo ${sector_inicio} | awk '{printf("%c%c%c%c",$1%256,$1/256,$1/65536,$1/16777216)}'|dd bs=1 count=4 seek=28 of=${particion}
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: al establecer el sector de inicio"
		return 1
	fi

	escribeLog "Se estableció el sector de inicio de la partición"
	return 0
}

# Recibe la partición 
modificaBootIni()
{
	if [ $# -ne 1 ]; then
		echo "modificaBootIni() ERROR: Debe de pasar la partición!!"
		exit 1
	fi

	dispositivo=$1
	nomdis=`echo $dispositivo | cut -f3 -d/`
	
	if [ ${#nomdis} -lt 4 ]; then
		escribeLog "modificaBootIni() ERROR: No es una partición válida"
		return 1
	fi

	ntfsEstaMontado $dispositivo
	if [ $? -ne 0 ]; then
		escribeLog "ERROR: no se encuentra montada la partición para modificar el boot.ini"
		return 1
	fi

	fichero_bootini=${ROOTNTFS}/${nomdis}/boot.ini

	if [ ! -f $fichero_bootini ]; then
		escribeLog "ERROR: no se encuentra el fichero boot.ini!"
		return 1
	fi

	# Fixme: corregir esta guarrada!
	case ${nomdis:0:3} in
		"sda" )
			disco=0
			;;
		"sdb" )
			disco=1
			;;
		"sdc" )
			disco=2
			;;
		"sdd" )
			disco=3
			;;
		*)
			escribeLog "modificaBootIni() ERROR: $nomdis No es un tipo de dispositivo soportado"
			return 1
			;;
	esac
	numero_particion=${nomdis:3:4}

	# Sustituimos en el boot.ini
	cadena_sed="s/\\r//"
	cadena_sed="${cadena_sed}
		s/rdisk(0)/rdisk(${disco})/"
	cadena_sed="${cadena_sed}
		s/partition(1)/partition(${numero_particion})/"
	cadena_sed="${cadena_sed}
	s/$/\\r/"

	cp $fichero_bootini /tmp/boot.ini.orig

	escribeLog "La cadena sed: $cadena_sed"
	sed "${cadena_sed}" /tmp/boot.ini.orig > $fichero_bootini
	if [ $? -ne 0 ]; then
                escribeLog "ERROR: durante la sustitución de opciones del boot.ini!"
                return 1
	fi

	escribeLog "Boot.ini modificado correctamente"

	return 0
}

